﻿#ifndef QDISKINFOPROVIDER_H
#define QDISKINFOPROVIDER_H

#include <QObject>
#include <QString>
#include <QList>

class QDiskInfoProvider : public QObject
{
    Q_OBJECT

public:
    explicit QDiskInfoProvider(QObject *parent = nullptr);

    /**
     * 存储物理磁盘设备的详细信息（非分区级别信息）
     * 注：该结构描述的是物理磁盘设备（如硬盘、SSD），不是逻辑分区
     */
    struct DiskDetails {
        // 设备在操作系统中的标识路径（原始设备路径）
        // 示例: Linux -> "/dev/sda", Windows -> "\\\\.\\PhysicalDrive0"
        QString device;

        // 磁盘制造商和型号信息（直接从硬件读取的原始字符串）
        // 示例: "Samsung SSD 860 EVO 500GB", "WD Blue SN550 NVMe"
        QString model;

        // 磁盘的唯一硬件序列号（全大写且不含空格）
        // 格式: 通常为16-20位字母数字组合，示例: "S3E8NA0M555555K"
        // 注意：部分旧硬盘可能返回 "Unknown" 或空字符串
        QString serialNumber;

        // 磁盘总容量的格式化字符串（含单位）
        // 单位: 自动转换为最适合的单位（GiB/TiB）
        // 示例: "465.76 GiB", "1.82 TiB"
        // 注意：该值可能与标称容量存在二进制/十进制单位差异（如标称500GB显示为465.76GiB）
        QString size;

        // 磁盘接口的物理连接协议类型（全大写格式）
        // 可能值: "SATA", "NVMe", "SCSI", "USB", "PCIe", "UNKNOWN"
        // 注意：NVMe实际是协议而非接口类型，但此处按行业习惯归类
        QString interfaceType;

        // 磁盘上的分区总数（包括所有主分区、扩展分区和逻辑分区）
        // 特殊值:
        //   - 0 = 未分区的新磁盘
        //   - -1 = 无法检测（如硬件错误）
        QString partitionCount;

        // 磁盘使用的传输协议（当interfaceType为PCIe时进一步细分）
        // 示例: "AHCI", "NVMe 1.4", "UASP"
        QString protocol;

        // 连接接口的物理形态（与interfaceType配合使用）
        // 示例: "M.2 2280", "2.5-inch SATA", "U.2"
        QString formFactor;
    };

    QList<DiskDetails> getAllDisksDetails() const;

private:
    QList<DiskDetails> getDisksDetailsWindows() const;
    QList<DiskDetails> getDisksDetailsLinux() const;
};

#endif // QDISKINFOPROVIDER_H
